// -----------------------------------

// 先了解一下反射
// 反射提供了使用者去操作对象属性的能力，但是并没有提供修改对象属性的能力
// 这样有什么好处，对比下面的例子就知道
// const obj = {
//     nane: '彭浪',
//     age: 25
// }
// Reflect.set(obj, 'name', '彭大浪')

// Object.defineProperty(obj, 'name', {
//     enumerable: true,
//     configurable: true
// })

// console.log(obj);
// console.log(Reflect.get(obj, 'name'));
// console.log(Reflect.get(obj, 'age'));

// -----------------------------------


// 属性描述符合Object.defineProperty

// const obj = {
//     name: '彭浪',
//     age: 25,
//     like: 'play football',
//     [Symbol.iterator]() {
//         return {
//             next:() => {
//                 return {
//                     value: this.age++,
//                     done: this[`_age`] > 39
//                 }
//             }
//         }
//     }
// }

// for (const key in obj) {
//     const mapNewObj = {}
//     mapNewObj[key] = obj[key]
//     Object.defineProperty(obj, key, {
//         get() {
//             console.log(`读取了${key}的值`);
//             return obj[`_${key}`] ? obj[`_${key}`] : mapNewObj[key]
//         },
//         set(val) {
//             console.log('重新赋值了');
//             // 这里新增下划线，防止设置时
//             obj[`_${key}`] = val
//         }
//     })
// }
/**
 * @description forof会执行可迭代对象的迭代器，返回迭代器的返回值的对象的value属性的值
 * 
 */
//  for (const iterator of obj) {
//     console.log(iterator);
//  }

// -----------------------------------
// 此段代码会内存溢出
const obj1 = {
    name: 'Tom'
}

Object.defineProperty(obj1, 'name', {
    get() {
        const name = obj1.name
        return name
    },
    set(val) {
        obj1.name = val
    }
})

// -----------------------------------


